﻿#ifndef COMMONTYPE_H_
#define COMMONTYPE_H_

#include <QString>
#include <QStringList>

namespace zl {

/* language */
enum ELanguageType {
    ELanguageType_Cn               = 0,
    ELanguageType_En               = 1
};

// 通讯结果 1 成功 2 失败 3 超时
enum EMsgSendResultType {
    EMsgSendResultType_Success  = 0,
    EMsgSendResultType_Fail     = 1,
    EMsgSendResultType_TimeOut  = 2
};

/* erro code */
enum EResult {
    EResult_Success,
    EResult_Failed,

    EResult_OpenFileFailed,
    EResult_WriteFileFailed,
    EResult_ParseJsonFailed,

    EResult_OrderNotFound,

    EResult_CabinetNotInitialized,
    EResult_InvalidLockerNo,
    EResult_InvalidCard,

    EResult_Unknown					= 0xFF
};

enum EWF {
        EWF_Home = 0,                   // 展示 首页

        EWF_Unknow
};

enum EBP {
        EBP_Select_page = 0,            // 展示 后台选择界面
        EBP_Record_page,                // 展示 记录查询界面
        EBP_Advance_page,               // 展示 高级设计界面

        EBP_Unknow
};

// 需要用户确认的种类
enum EUserConfirmType {
    EUserConfirmType_Unknown = -1,

    EUserConfirmType_EraseExistSN,      // 用户确认擦除已经存在的SN
    EUserConfirmType_DeleteAction,      // 用户确认删除操作记录
    EUserConfirmType_DeleteSN,          // 用户确认删除SN记录
};


/* action type */
enum ESNWT_ActionType {
    ESNWT_ActionType_Unknow             = -1,

    ESNWT_ActionType_Read               = 0,        // 读取sn
    ESNWT_ActionType_Erase              = 1,        // 擦除sn
    ESNWT_ActionType_Mcu                = 2,        // 擦除mcu
    ESNWT_ActionType_OneKeyWrite        = 3         // 一键写入sn
};

/* result type */
enum ESNWT_ResultType {
    ESNWT_ResultType_Unknow             = -1,

    ESNWT_ResultType_Success = 0,                   // 成功
    ESNWT_ResultType_Failed,                        // 失败
//    ESNWT_ResultType_Read_Fail,                     // 读取sn失败
//    ESNWT_ResultType_Erase_Mcu_Fail,                // 擦除mcu失败
//    ESNWT_ResultType_Erase_Page_Fail,               // 擦除sn所在page失败
//    ESNWT_ResultType_Write_Fail,                    // 写入sn失败

//    ESNWT_ResultType_Re_Read_Fail,                  // 写入sn完毕后 读取sn失败
//    ESNWT_ResultType_Read_Check_Fail,               // 写入sn完毕后 读取到的sn与写入的sn比对失败
//    ESNWT_ResultType_Other_Error,                   // 其他错误
};


// 信息上传服务器状态
enum EConfirm_Type
{
    EConfirm_Type_Unknown = -1,             // 默认 未知
    EConfirm_Type_Not_Need,                 // 无需上传
    EConfirm_Type_Need,                     // 需要上传
    EConfirm_Type_confirmded,               // 上传成功
};


/* Configuration */

// cabinet info
struct CabinetInfo
{
    QString                         title;
    QString                         name;
    QString                         cabinet_no;
    ELanguageType                   language;

    CabinetInfo()
    {
        title = "";
        name = "";
        cabinet_no = "";
        language = ELanguageType_Cn;
    }
};

// 监控板配置
struct MonitorConfig
{
    QString                         port;               // 串口号
    QString                         baud_rate;          // 波特率
    bool                            enable_monitor_control_power;       // 是否启用监控板控制核心板电源重启

    MonitorConfig()
    {
        port = "";
        baud_rate = "";
        enable_monitor_control_power = false;
    }
};

// SN address config
struct SNConfig
{
    QString                         address;            // 写入flash地址
    int32_t                         sn_rule_len;        // sn标准字符长度
    int32_t                         sn_mem_bytes_len;   // sn写入内存占据字节长度

    SNConfig()
    {
        address = "0x12000000";
        sn_rule_len = 14;
        sn_mem_bytes_len = 16;
    }
};

//// db config
//typedef struct {
//    int32_t							port;
//    int32_t							type;
//    QString 						addr;
//    QString 						user;
//    QString 						pwd;
//    QString 						name;
//}DatabaseConfig;

/// \brief 数据库配置信息
typedef struct
{
    int32_t remote_port;        ///< 数据库连接端口
    int32_t type;               ///< 数据库类型
    QString remote_addr;        ///< 数据库连接地址
    QString user;               ///< 数据库连接用户名
    QString pwd;                ///< 数据库连接密码
    QString name;               ///< 数据库名
} DatabaseConfig;

// record info
struct RecordInfo
{
    QString                         record_id;

    QString                         account;            // 操作人员账号
    QString                         name;               // 操作人员姓名

    QString                         action_time;        // 操作时间
    ESNWT_ActionType                action_type;        // 操作类型
    ESNWT_ResultType                result_type;        // 执行结果
    QString                         describe;           // 结果描述
    QString                         sn_info;            // sn信息
    EConfirm_Type                   confirmded;         // 信息上传服务状态标记

    RecordInfo()
    {
        record_id = "";

        account = "";
        name = "";

        action_time = "";
        action_type = ESNWT_ActionType_Unknow;
        result_type = ESNWT_ResultType_Unknow;

        describe = "";
        sn_info = "";

        confirmded = EConfirm_Type_Unknown;
    }
};
typedef QVector<RecordInfo> RecordVec;

// sn info
struct SNInfo
{
    QString                         account;            // 操作人员账号
    QString                         name;               // 操作人员姓名

    QString                         action_time;        // 操作时间
    QString                         sn_info;            // sn扫描信息
    QString                         sn_tail;            // sn补入尾部信息
    QString                         sn_total;           // sn完整信息

    SNInfo()
    {
        account = "";
        name = "";

        action_time = "";
        sn_info = "";
        sn_tail = "";
        sn_total = "";
    }
};
typedef QVector<SNInfo> SNInfoVec;

// 用户数据结构
struct AccountData
{
    QString                         loginID;            // 登录账号
    QString                         name;               // 姓名

    QString                         roleType;           // 用户角色权限
    QString                         warehousePlace;     // 储存在仓库的位置
    QString                         mobile;             // 手机号码
    QString                         menu;               // 菜单权限

    AccountData()
    {
        clear();
    }

    void clear()
    {
        loginID = "";
        name = "";

        roleType = "";
        warehousePlace = "";
        mobile = "";
        menu = "";
    }
};

typedef struct {
    CabinetInfo						cabinet;
    DatabaseConfig                  database;
    MonitorConfig                   monitor_config;
    SNConfig                        sn_config;
}AppConfig;


// manager card
typedef struct ManagerCard {
    QString 						cardno;
    int32_t							status;
    int32_t                         type;
}ManagerCard;
typedef QVector<ManagerCard> ManagerCardVec;


// order
typedef struct Order {
    QString                         order_id;
    int32_t							status;

    QString                         send_time;          // 投递时间
    QString                         receive_time;       // 取件时间

    QString                         sender_account;     // 投递账号 // 当前存件人user_id //***终端软件中user_id实际采用login_name字段
    QString                         receiver_account;   // 接收账号 // 当前取件人登录名

    int32_t                         box_no;             // 投递箱号
    QString                         bussiness_id;       // 服务器业务编号
    int32_t                         confirmed;          // 是否上报成功

}Order;
typedef QVector<Order> OrderVec;


}


//  非零开头正整数
#define REG_EXP_BOX_NO      "^[1-9]*[1-9][0-9]*$"

// 10位或11位数字
#define REG_EXP_ACCOUNT     "^[0-9]{9,10}[0-9]$"

// 6位到10位数字 用于后台账号
#define REG_EXP_MANAGER     "^[0-9]{5,9}[0-9]$"

// 1位或2位数字 用于设置保存日志记录的月份
#define REG_EXP_RECORD      "^[1-9]{0,1}[0-9]$"

// 1位或4位数字 用于设置以秒位单位超时时长
#define REG_EXP_SECONDS     "^[1-9][0-9]{0,3}$"

// 1位或4位数字 用于设置人脸识别区域
#define REG_EXP_FACE_POS    "^[0-9][0-9]{0,3}$"

// 6位数字
#define REG_EXP_PWD         "^[0-9]{5}[0-9]$"

// 纯英文字母
#define REG_EXP_SHORT_NAME  "^[A-Za-z]+$"

// 取件码 英文字母或数字
//#define REG_EXP_PIN_CODE    "^[A-Za-z0-9]{8}$"
#define REG_EXP_PIN_CODE    "^[0-9]{8}$"

// 手机号码 符合中国手机号段
//#define REG_EXP_PHONE       "^(13[0-9]|14[5-9]|15[0-3,5-9]|16[6]|17[2-8]|18[0-9]|19[1|3|8|9])[0-9]{8}$"
#define REG_EXP_PHONE       "^[1]([3-9])[0-9]{9}$"

//
#define DEL_STR_BLANK       QRegExp("\\s")

// 日志文件保存最小月数
#define MINI_MONTHS_LOG_FILE            1

// 后台操作记录保存最小月数
#define MINI_MONTHS_OPER_RECORD         3

// 订单保存最小月数
#define MINI_MONTHS_ORDER               3

// 等待扫描时间 单位：秒
#define SCAN_TIME   30

// 等待请求服务器时间 单位：秒
#define REQ_TIME    30




#define PAGE_ADDR   0x12000000

#define SN_MAX_LEN          14
#define SN_ADD_TAIL_LEN     2

// sn 地址的规则 0x12000000
#define REG_EXP_SN_ADDRS    "^0[xX]12[A-Fa-f0-9]{6}$"

// 1位或2位数字 用于设置sn规则长度 sn写入内存长度
#define REG_EXP_SN_LEN      "^[1-9]{0,1}[0-9]$"

// 开头标记 以字符串"0x12000"开头 第十一位是字符':'
#define REG_START_SIGN      "^0x12[A-Fa-f0-9]{6}:"

// 结尾标记 以字符'|'开头 中间任意字符大于0个 以字符'|'结尾
#define REG_END_SIGN       "\\|(.+)\\|"


#endif // COMMONTYPE_H_
